home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Shareware / IDimager Personal 4.2.0.3 / setup_IDimager_Personal_V4.exe / {app} / Scripts / Meta Data Scripts / Analyse Exif Usage.psc < prev    next >
Text File  |  2008-06-04  |  4KB  |  152 lines

  1. const
  2.   cTags = 'ISOSpeedRatings,FNumber,LensInformation';
  3.  
  4.   procedure DumpContent (AContainer: TMacroParam; AWithSave: Boolean);
  5.   var
  6.     i, j: Integer;
  7.     AParam, AElem: TMacroParam;
  8.     ASl: TStringList;
  9.     ASaveDialog: TSaveDialog;
  10.   begin
  11.     ASl := TStringList.Create;
  12.     try
  13.       for i := 0 to AContainer.ArrayContent.Count - 1 do
  14.       begin
  15.         AParam := AContainer.ArrayContent.Items[i];
  16.  
  17.         for j := 0 to AParam.ArrayContent.Count - 1 do
  18.         begin
  19.           AElem := AParam.ArrayContent.Items[j];
  20.  
  21.           // CSV formatted
  22.           ASl.Add ('"' + AParam.ParamName + '","' + AElem.ParamContent + '",' + IntToStr (AElem.Tag));
  23.         end;
  24.       end;
  25.  
  26.       if AWithSave then
  27.       begin
  28.         ASaveDialog := TSaveDialog.Create (nil);
  29.         try
  30.           if ASaveDialog.Execute then
  31.           begin
  32.             ASl.SaveToFile (ASaveDialog.FileName);
  33.  
  34.             Say (Format('Result is saved as %s', [ASaveDialog.FileName]));
  35.           end;
  36.         finally
  37.           ASaveDialog.Free;
  38.         end;
  39.       end;
  40.     finally
  41.       ASl.Free;
  42.     end;
  43.   end;
  44.  
  45.   function PrepareContainer (var AContainer: TMacroParam): Boolean;
  46.   var
  47.     ATif: TTif;
  48.     t, i: Integer;
  49.  
  50.     ATags: TStringList;
  51.  
  52.     AElemContainer: TMacroParam;
  53.     AElem: TMacroParam;
  54.     AVal: Variant;
  55.  
  56.     AXmp: TXMP;
  57.   begin
  58.     result := False;
  59.  
  60.     ATags := TStringList.Create;
  61.  
  62.       AContainer.ParamType := ptBag;
  63.       AContainer.ArrayElementParamType := ptBag;
  64.  
  65.       ATags.CommaText := cTags;
  66.  
  67.       for t := 0 to ATags.Count - 1 do
  68.       begin
  69.         ATags.Strings[t] := Trim (ATags.Strings[t]);
  70.  
  71.         AElemContainer           := AContainer.AddArrayElement('');
  72.         AElemContainer.ParamName := ATags.Strings[t];
  73.  
  74.         ATags.Objects[t] := AElemContainer;
  75.       end;
  76.  
  77.       Progress.Cancel := False;
  78.       Progress.useProgress;
  79.       Progress.Max := Selected.Count;
  80.       Progress.Pos := 0;
  81.       Progress.Show;
  82.  
  83.       // process every item
  84.       for i := 0 to Selected.Count - 1 do
  85.       begin
  86.         Progress.ProgressText := Selected.Items[i].FileNameOnly;
  87.         Progress.Pos := i + 1;
  88.  
  89.         ATif := TTif.Create(nil);        // the embedded meta processor
  90.         try
  91.           ATif.FileName := Selected.Items[i].ExifFileName;
  92.           if not Selected.Items[i].MediumLoaded then
  93.           begin
  94.             AXmp := TXMP.Create(False);
  95.             try
  96.               Catalog.LoadXMPForImage (Selected.Items[i], AXmp, True);
  97.               AXmp.PushToTif (ATif);
  98.             finally
  99.               AXmp.Free;
  100.             end;
  101.           end
  102.           else
  103.             ATif.Load (True, False);
  104.  
  105.           if ATif.HasExif then
  106.           begin
  107.             for t := 0 to ATags.Count - 1 do
  108.             begin
  109.               AElemContainer := ATags.Objects[t];
  110.  
  111.               AVal := ATif.TagValueByName (ATags.Strings[t], [itBase, itExif, itIPTC, itInterExif, itGps, itMakerNotes], False);
  112.               AElem := AElemContainer.ArrayContent.FindContent (AVal, True);
  113.               if AElem = nil then
  114.                 AElem := AElemContainer.AddArrayElement(AVal);
  115.               AElem.Tag := AElem.Tag + 1;
  116.             end;
  117.           end;
  118.         finally
  119.           ATif.Free;
  120.         end;
  121.  
  122.         if Progress.Cancel then
  123.           break;
  124.       end;
  125.  
  126.       result := not Progress.Cancel;
  127.  
  128.     ATags.Free;
  129.  
  130.     Progress.Hide;
  131.   end;
  132.  
  133.  
  134. var
  135.   AContainer: TMacroParam;
  136. begin
  137.   if Selected.Count = 0 then
  138.   begin                 
  139.     Say ('no selection made');
  140.     exit;
  141.   end;
  142.  
  143.   AContainer := TMacroParam.Create(nil);
  144.  
  145.     if not PrepareContainer(AContainer) then
  146.       Say ('Cancelled. You can still save the analysed data up to the moment you cancelled it.');
  147.  
  148.     DumpContent (AContainer, True);
  149.  
  150.   AContainer.Free;
  151. end;
  152.